import axios from 'axios'
import type { AxiosInstance } from 'axios'  //导入axios实例类型都要加type
// import { useUserStore } from '@/stores/userStore'
import { showLoadingToast,closeToast } from 'vant';

const isDev = process.env.NODE_ENV === 'development'

// const userInfo = useUserStore() //接收函数返回值  这里报错了ts脚本里  报错原因：

const request:AxiosInstance = axios.create({  //10.31.155.33  http://10.31.155.4   远程让别人访问：http://10.31.155.34
    baseURL: isDev? 'http://myappcd.a1.luyouxia.net:24217/api':'http://127.0.0.1:3000/api',
    timeout: 60000
})

// 添加请求拦截器  
request.interceptors.request.use(function (config) {  //request为axios实例 官网的axios改为request
    
  // //开启loading图标    加这个导致showToast不生效  把请提示覆盖掉了
  showLoadingToast({
    message: '加载中...',
    forbidClick: true,
    loadingType: 'spinner',
    duration:60000   //duration	展示时长(ms)，值为 0 时，toast 不会消失
  });
  
  // 在发送请求之前做些什么
    // 在请求头配置一个 token  
    // const userInfo = useUserStore()   //放在这里不报错了
    // config.headers.token = userInfo.token 
    // config.headers.token = localStorage.getItem('token')  
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
request.interceptors.response.use(function (response) {

  //关闭加载图标
  closeToast();  //请求完成后关闭loading图标
  
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    // if(response.data.data){  //接口有的是返回data    有的是直接返回数据  此处要处理一下 对应的使用接口的代码都改一下
    //   return response.data   //这样都在接口使用的时候都统一使用res.data
    // }
    // else{
    //   return response;   //有问题是step3提交服务器的代码没写
    // }
    return response.data;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

  interface Iconfig{
    url:string;
    method?:string;  //如果不传默认是get 可选参数
    data?:any;
    headers?:any;
  }

export function ajax(config:Iconfig){
    //解构config对象
    const {url='', method='get',data={},headers={}} = config

    switch(method.toUpperCase()){
        case 'GET':
        return request.get(url,{params:data})  //返回一个promise对象
    
    case 'POST':
       // 判断 post 请求提交的是不是表单数据
        if(headers['content-type'] == 'application/x-www-form-urlencoded'){
        // 数据的序列化，格式化数据一次
        const obj = new URLSearchParams()

        for(const key in data){
           obj.append(key,data[key])
        }
 
       return request.post(url,obj,{ headers })
       }
    // 判断提交的内容是不是一个文件
       if (headers['content-type'] == 'multipart/form-data') {
           // 数据的序列化，格式化数据一次
           const obj = new FormData()
           for (const key in data) {
               obj.append(key, data[key])
           }
           return request.post(url, obj, { headers })
       }  
       // json 数据的提交 axios会自动解析json数据
       return request.post(url, data)

       case 'PUT':
           // 用来更新数据用的
           return request.put(url, data)

        default:
               // 如果前面全部都不是
           return request.request(config);
    }
} 